package com.eltsistemas.controller.afastamento;

import java.text.ParseException;
import java.util.Calendar;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.eltsistemas.adapter.Calendario;
import com.eltsistemas.dao.AfastamentoDao;
import com.eltsistemas.dao.GenericDao;
import com.eltsistemas.hibernate.HibernateUtil;
import com.eltsistemas.modelo.Afastamento;
import com.eltsistemas.modelo.Funcionario;

@Controller
@RequestMapping(value="/afastamento")
public class AfastamentoAltera {
	
	@RequestMapping(value="/alterado", method=RequestMethod.POST)
	public String adiciona(Afastamento afastamento, String dtInicio, String dtFim, String nomeFuncionario, 
						   String mot) throws ParseException
	{
		try
		{
			//Comparando as datas
			Calendario calendario = new Calendario();
			
			Calendar dataInicio = calendario.getData(dtInicio);
			Calendar dataFim = calendario.getData(dtFim);
	
			if(calendario.compare_Data(dataInicio, dataFim) == true)
			{
				//Iniciando conexao e abrindo uma transacao
				Session session = new HibernateUtil().getSession();
				session.beginTransaction();
				
				GenericDao<Funcionario> daoFuncionario = new GenericDao<>(session, Funcionario.class);
				Funcionario funcionario = daoFuncionario.findByName(nomeFuncionario);
				
				if( verificaPeriodo_ForUpdate(dataInicio, dataFim, afastamento.getId(), funcionario.getId()) )
				{
					GenericDao<Afastamento> daoAfastamento = new GenericDao<>(session, Afastamento.class);
					
					//Atualiza os dados do objeto	
					afastamento.setDataInicio( dataInicio );
					afastamento.setDataFim( dataFim );
					afastamento.setFuncionario(funcionario);
					
					/*Salvando objeto no session, comitando os dados no banco e
					 * finalizando a conexao
					 */
					session = daoAfastamento.altera(afastamento);	
					session.beginTransaction().commit();
					session.close();
					
					return "redirect:lista?nomeFuncionario="+nomeFuncionario;	
				}
				else
				{
					//Finalizando conexao
					session.close();
	
					return "redirect:lista?valor=data-periodo-invalido&nomeFuncionario="+nomeFuncionario;	
				}
				
			}
			
			//Executa se a data final for menor que a data inicial
			return "redirect:lista?valor=data-final-maior&nomeFuncionario="+nomeFuncionario;
		}
		catch(HibernateException e)
		{
			return "redirect:/painel/erro";
		}
	}
	
	public boolean verificaPeriodo_ForUpdate(Calendar dtInicio, Calendar dtFim, Long id_Afastamento, Long id_Funcionario)
	{
		//Iniciando conexao e abrindo uma transacao
		Session session = new HibernateUtil().getSession();
		
		AfastamentoDao daoAfastamento = new AfastamentoDao(session);
		int item = daoAfastamento.verificaPeriodo_ForUpdate(dtInicio, dtFim, id_Afastamento, id_Funcionario).size();
		
		//Finalizando conexao
		session.close();
		
		if( item == 0 )
		{
			return true;
		}
		return false;
	}

}
